Computer programs are commonly designed so that one application can have its functionality extended or enhanced by another application. The other application can interface with the original application in a variety of ways, and the mechanism for this extension can have several names, such as a contract, application programming interface (API), plug-in, extension, add-on, and the like.
Several challenges arise when designing applications that can be extended. These challenges include, but are not limited to, the ability to describe extension points, the ability to discover extensions, and the ability to activate those extensions. Security and performance issues also can arise with extensions. For example, an extension can cease operating, terminate or degrade performance, which in turn can impact the original application. Additionally, the extent to which data is shared between the extension and the original application can affect security of that data.